﻿using RotovapPlatform.Domain.Business.Storage.Entities;
using RotovapPlatform.Domain.Business.Storage.Entities.Base;
using RotovapPlatform.Domain.Business.Storage.Entities.Bottles;
using RotovapPlatform.Domain.Business.Storage.Enums;
using System;
using static RotovapPlatform.Domain.Business.Machine.Enums.ExperimentConfigEnums;

namespace RotovapPlatform.Application.Services.Storages
{
	/// <summary>
	/// 存储应用服务接口
	/// 定义了UI层可以使用的物料管理功能
	/// </summary>
	public interface IStorageAppService
	{
		/// <summary>
		/// 获取所有货架位置
		/// </summary>
		Task<List<StorageLocation>> GetAllShelfLocationsAsync();

		/// <summary>
		/// 获取指定货架位置
		/// </summary>
		Task<StorageLocation?> GetShelfLocationAsync(LocationCode locationCode, int position);

		/// <summary>
		/// 根据ID获取货架位置
		/// </summary>
		[Obsolete("请使用基于位置的方法 GetShelfLocationAsync(LocationCode, int) 代替")]
		Task<StorageLocation?> GetShelfLocationByIdAsync(int id);

		/// <summary>
		/// 获取所有工作站位置
		/// </summary>
		Task<List<StorageLocation>> GetStationLocationsAsync(LocationCode stationType);

		/// <summary>
		/// 获取可以放置指定物品类型的空闲货架位置
		/// </summary>
		Task<List<StorageLocation>> GetAvailableShelfLocationsForItemTypeAsync(ItemType itemType);

		/// <summary>
		/// 将物品放入指定货架位置
		/// </summary>
		[Obsolete("请使用基于位置的方法 PlaceItemByPositionAsync(LocationCode, int, IStorageItem) 代替")]
		Task<StorageLocation> PlaceItemAsync(int locationId, IStorageItem item);

		/// <summary>
		/// 将物品放入指定货架位置（通过位置编号）
		/// </summary>
		Task<StorageLocation> PlaceItemByPositionAsync(LocationCode locationCode, int position, IStorageItem item);

		/// <summary>
		/// 从指定货架位置取出物品
		/// </summary>
		[Obsolete("请使用基于位置的方法 RemoveItemByPositionAsync(LocationCode, int) 代替")]
		Task<IStorageItem?> RemoveItemAsync(int locationId);

		/// <summary>
		/// 从指定货架位置取出物品（通过位置编号）
		/// </summary>
		Task<IStorageItem?> RemoveItemByPositionAsync(LocationCode locationCode, int position);

		/// <summary>
		/// 检查物品是否可以放入指定位置
		/// </summary>
		[Obsolete("请使用基于位置的方法 CanPlaceItemTypeByPositionAsync(LocationCode, int, ItemType) 代替")]
		Task<bool> CanPlaceItemTypeAsync(int locationId, ItemType itemType);

		/// <summary>
		/// 检查物品是否可以放入指定位置（通过位置编号）
		/// </summary>
		Task<bool> CanPlaceItemTypeByPositionAsync(LocationCode locationCode, int position, ItemType itemType);

		/// <summary>
		/// 获取货架位置的显示名称
		/// </summary>
		string GetShelfDisplayName(int position);

		/// <summary>
		/// 根据显示名称获取货架位置编号
		/// </summary>
		int GetShelfPositionFromDisplayName(string displayName);

		/// <summary>
		/// 创建新的旋蒸瓶
		/// </summary>
		RotovapBottle CreateRotovapBottle(bool is1000ml, FunctionType function, string materialName, bool isClean);

		/// <summary>
		/// 创建新的离心瓶
		/// </summary>
		CentrifugeBottle CreateCentrifugeBottle(FunctionType function, string materialName, double currentVolume);

		/// <summary>
		/// 创建新的取样瓶
		/// </summary>
		SampleBottle CreateSampleBottle(FunctionType function, string materialName, double currentVolume);
	}
}